/*
  购物车功能分析：
    * 加入购物车：添加信息到本地 (详情页) -ok
      * 判断是否含有该商品
        * 没有商品：新增一条数据
        * 有这个商品：修改这个商品的数量
    * 显示购物车数据(购物车页)
      * 布局：vantUI-weapp - ok
      * 样式 -ok
      * 获取本地数据渲染页面 -ok
    * 单选、全选、反选(购物车页) -ok
    * 统计：总价、总数量(购物车页) -ok
    * 数量加减(购物车页) -ok
    * 删除某个商品(购物车页) -ok
    * 加入订单：跳到订单页
    
  购物车数据存储：
    * 数据存在本地：没有登陆，点击提交订单就让用户登陆，把本地数据转存到数据库(选这种做法)
    * 数据存到数据库：加入购物车必须要登陆
  
  存数据到本地：数据的存储结构
    [{
      gid : 商品id,
      gtitle : 商品标题,
      gprice : 商品价格,
      gnum : 商品数量,
      gimgurl : 商品缩略图,
      gchecked : true 是否要购买：复选框的状态
    }]
*/
//封装一个类库，里面全部是购物车相关的功能
class ShopCartCtrl{
  //获取购物车数据
  getCartData() {
    return wx.getStorageSync('cartData') || [];
  }
  //存储购物车数据
  setCartData(data) {
    //data是数组结构 [{},{}]
    wx.setStorageSync('cartData', data);
  }
  //添加购物车
  addCartData(goodinfo){
    console.log('传入的商品数据',goodinfo );
    //goodinfo代表一条完整的商品数据
    //1.取出本地存储数据
    let goodsList = this.getCartData();
    //2.判断新数据，是否已经存在,进行数据修改
    let selIndex = this.isExist(goodinfo.gid);
    if(selIndex == -1) {
      //证明：不存在,新增一条商品数据
      goodsList.push(goodinfo);
    }else{
      //证明：存在，修改数量
      goodsList[selIndex].gnum = Number(goodsList[selIndex].gnum) + Number(goodinfo.gnum);
    }
    //3.存储数据
    this.setCartData(goodsList);
  }
  //判断商品gid是否已经存在
  isExist(gid) {
    //1.取出本地存储数据
    let goodsList = this.getCartData();
    //2.循环数组里面的每一个gid和传入的gid进行比较：如果相等==存在->返回数组下标；不相等==不存在->返回-1
    for(let index = 0; index < goodsList.length; index++) {
      if(goodsList[index].gid == gid){
        //如果相等==存在->返回数组下标
        return index;
      }
    }
    //不相等==不存在->返回-1
    return -1;
  }
  //单选功能
  selOneGood(gid){
    //1.取出本地存储数据
    let goodsList = this.getCartData();
    //2.判断你要改的数据是第几条
    let selIndex = this.isExist(gid);//下标
    //3.直接修改这一天的选中状态
    goodsList[selIndex].gchecked = !goodsList[selIndex].gchecked;
    //4.把数据存回本地存储
    this.setCartData(goodsList);
    //5.单选控制全选：联动效果
    //every() 返回布尔值，所有item都满足条件，就返回ture，否则返回false
    let selsAll = goodsList.every(item => {
      return item.gchecked;
    });
    return selsAll;
  }
  //全选和反选
  selAll(status) {
    //status == true ：把所有商品的状态都变成true
     //1.取出本地存储数据
     let goodsList = this.getCartData();
     //2.遍历数组，让数组的状态都改变
     goodsList.forEach(item => {
       item.gchecked = status;
     });
     //3.把数据存回本地存储
    this.setCartData(goodsList);
  } 
  //统计总数量和总价
  getPriceCount() {
     //1.取出本地存储数据
     let goodsList = this.getCartData();
     //2.准备两个变量：存放总价和总数量
     let price = 0;
     let total = 0;
     //3.遍历数组累加数量和小计：小计：单个商品单价*数量=29.9*2=58
     goodsList.forEach(item => {
       if(item.gchecked){
         //这个商品是准备要购买
         total += Number(item.gnum);//Number() 强制类型转化：把字符串转成数字
        //  console.log('商品单价和数量',item.gprice,item.gnum)
         price += Number(item.gprice) * Number(item.gnum);
       }
     });
    //  console.log('总数量和总价',total,price)
     return {total,price};
  }
  //数量加1
  addGoodNum(gid) {
    //1.取出本地存储数据
    let goodsList = this.getCartData();
    //2.判断你要改的数据是第几条
    let selIndex = this.isExist(gid);//下标
    //3.修改某条商品的数量 +1：库存量：8  A:加一份到购物车  B：库存量 7
    if(goodsList[selIndex].gnum < 8) {
      goodsList[selIndex].gnum += 1;
    }
   //4.把数据存回本地存储
   this.setCartData(goodsList);
  }
  //数量减1
  cutGoodNum(gid) {
    //1.取出本地存储数据
    let goodsList = this.getCartData();
    //2.判断你要改的数据是第几条
    let selIndex = this.isExist(gid);//下标
    //3.修改某条商品的数量 +1：库存量：8  A:加一份到购物车  B：库存量 7
    if(goodsList[selIndex].gnum > 1) {
      goodsList[selIndex].gnum -= 1;
    }
   //4.把数据存回本地存储
   this.setCartData(goodsList);
  }
  //删除一条商品
  delect(gid) {
    //1.取出本地存储数据
    let goodsList = this.getCartData();
    //2.删除数组里面和传入的gid一样的那条数据
    let result = goodsList.filter(item => {
      return item.gid != gid;
    });
    //3.把数据存回本地存储
    this.setCartData(result);
  }
  //选中的商品数据：订单页
  getSelectGoods() {
    //1.取出本地存储数据
    let goodsList = this.getCartData();
    //2.遍历数组，进行判断，把gchecked为真的商品留下来
    let result = goodsList.filter(item => {
      return item.gchecked;
    });
    return result;
  }
  //将购物车里面已经下单的数据，清除掉
  rmOrderGoods() {
    //1.取出本地存储数据
    let goodsList = this.getCartData();
    //2.过滤，留下gchecked为false
    let result = goodsList.filter(item => {
      return item.gchecked == false;
    });
    //3.存储到本地
    //3.把数据存回本地存储
    this.setCartData(result);
  }
}

//导出实例
module.exports = new ShopCartCtrl();